package com.sky.mapper;

import com.sky.dto.GoodsSalesDTO;
import com.sky.dto.OrdersPageQueryDTO;
import com.sky.entity.Orders;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.github.pagehelper.Page;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * PROJECT_NAME: sky-take-out
 * NAME: OrdersMapper
 * USER: zhang
 * DATE: 2023/5/28
 * DESCRIPTION :C端-订单信息持久层
 */
@Mapper
public interface OrdersMapper {
    /**
     * 添加订单基本信息
     * @param orders 订单基本信息
     */
    void submitOrders(@Param("orders") Orders orders);

    /**
     * 基于订单Id与用户Id查询订单
     *
     * @param userId      用户Id
     * @param orderNumber 订单编号
     * @return 订单基本信息
     */
    Orders selectOrderByOrderNumberAndUserId(@Param("userId") Long userId, @Param("orderNumber") String orderNumber);

    /**
     * 更新订单信息
     * @param orders 更新后的订单信息(包含Id)
     */
    void updateOrder(@Param("orders") Orders orders);

    /**
     * 基于条件查询订单信息
     * @param ordersPageQueryDTO 查询条件
     * @return 订单基本信息
     */
    Page<Orders> selectOrderByCondition(@Param("ordersPageQueryDTO") OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 通过订单Id查询订单基本信息
     * @param orderId 订单id
     * @return 订单基本信息
     */
    Orders selectOrderById(@Param("orderId") Long orderId);

    /**
     * 统计不同状态订单数量
     *
     * @return 封装伪表数据的List集合,里面是Map(每个Map表示一条数据) 列名:Key 数据值:Value
     */
    List<Map<String, Object>> selectOrderCount();

    /**
     * 基于订单状态和订单下单时间查询订单信息
     * @param status 订单状态(未付款)
     * @param orderTime 下单时间
     * @return 满足要求的订单信息集合
     */
    List<Orders> selectOrderByStatusAndLtOrderTime(@Param("status") Integer status, @Param("orderTime") LocalDateTime orderTime);

    /**
     * 基于订单持久层查询当天订单营业额
     * @param completed 订单状态
     * @param startTime 当天开始时间
     * @param endTime 当天结束时间
     * @return 当天的营业额
     */
    Double selectAmountByOrderStatusAndOrderTime(@Param("orderStatus") Integer completed,@Param("startTime") LocalDateTime startTime,@Param("endTime") LocalDateTime endTime);

    /**
     * 基于订单持久层查询每天有效的订单数量
     * @param completed 订单状态
     * @param startTime 当天开始时间
     * @param endTime 当天结束时间
     * @return 当天有效订单数量
     */
    Integer selectValidOrderCount(@Param("orderStatus") Integer completed,@Param("startTime") LocalDateTime startTime,@Param("endTime") LocalDateTime endTime);

    /**
     * 基于时间区间查询区间内有效订单售出的菜品/套餐的数量的前10
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return GoodsSalesDTO
     */
    List<GoodsSalesDTO> selectTop10(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
}
